package cn.edu.cn.sx;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletContext;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class MessageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 常量：用于在 ServletContext 中存储留言列表的 Key
    private static final String MESSAGE_LIST_KEY = "messageList";

    /**
     * 【生命周期方法】在 Servlet 第一次初始化时调用
     * 用于初始化共享的留言列表
     */
//    @Override
//    public void init() throws ServletException {
//        // 获取应用上下文对象
//        ServletContext context = this.getServletContext();
//
//        // 检查留言列表是否已存在（防止多次初始化）
//        if (context.getAttribute(MESSAGE_LIST_KEY) == null) {
//            // 使用 Collections.synchronizedList 确保线程安全（进阶点）
//            List<cn.edu.cn.sx.Message> messageList = Collections.synchronizedList(new ArrayList<>());
//
//            // 添加一个示例留言
//            messageList.add(new cn.edu.cn.sx.Message("系统管理员", "欢迎使用留言板！请开始您的实验。"));
//
//            // 将列表存入应用范围 (ServletContext)
//            context.setAttribute(MESSAGE_LIST_KEY, messageList);
//            System.out.println("留言列表初始化完成，存储于 ServletContext。");
//        }
//    }
    @Override
    public void init() throws ServletException {
        ServletContext context = this.getServletContext();

        if (context.getAttribute(MESSAGE_LIST_KEY) == null) {
            List<Message> messageList = Collections.synchronizedList(new ArrayList<>());

            // 尝试读取文件（不修改 Message 类的兼容方案）
            try {
                String webRootPath = context.getRealPath("/");
                File dataDir = new File(webRootPath, "data");
                File targetFile = new File(dataDir, "messages.txt");

                if (targetFile.exists() && targetFile.canRead()) {
                    try (BufferedReader reader = new BufferedReader(new FileReader(targetFile))) {
                        String line;
                        while ((line = reader.readLine()) != null) {
                            String[] parts = line.split("\\|");
                            if (parts.length == 3) {
                                String name = parts[0];
                                String content = parts[1];
                                // 注意：此处只能用双参构造，时间会被重置为当前时间
                                messageList.add(new Message(name, content));
                            }
                        }
                        System.out.println("从文件加载 " + messageList.size() + " 条历史留言（时间重置为当前）");
                    }
                } else {
                    // 文件不存在时添加默认留言
                    messageList.add(new Message("系统管理员", "欢迎使用留言板！请开始您的实验。"));
                    System.out.println("未找到历史留言文件，初始化默认留言");
                }

            } catch (IOException e) {
                e.printStackTrace();
                messageList.add(new Message("系统管理员", "欢迎使用留言板！请开始您的实验。"));
                System.out.println("读取历史留言失败，使用默认留言初始化");
            }

            context.setAttribute(MESSAGE_LIST_KEY, messageList);
            System.out.println("留言列表初始化完成");
        }
    }
//    @Override
//    public void loadMEssagesFromFile



    @Override
    public void destroy() {
        try {
            // 1. 获取 WebRoot（或 webapp）的绝对路径
            String webRootPath = this.getServletContext().getRealPath("/");
            // 2. 拼接 data 文件夹路径（若不存在会自动创建）
            File dataDir = new File(webRootPath, "data");
            if (!dataDir.exists()) {
                dataDir.mkdirs(); // 创建 data 文件夹
            }
            // 3. 拼接最终文件路径：WebRoot/data/messages.txt
            File targetFile = new File(dataDir, "messages.txt");

            // 4. 写入文件
            try (FileWriter writer = new FileWriter(targetFile)) {
                ServletContext context = this.getServletContext();
                List<Message> messages = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);
                for (Message msg : messages) {
                    String row = msg.getName() + "|" + msg.getContent() + "|" + msg.getFormattedTimestamp() + "\n";
                    writer.write(row);
                }
            }

            // 打印保存路径，方便验证
            System.out.println("留言已保存至：" + targetFile.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("保存留言失败：" + e.getMessage());
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 设置请求编码，处理中文乱码
        request.setCharacterEncoding("UTF-8");

        // 2. 获取 POST 参数
        String name = request.getParameter("name");
        String content = request.getParameter("message");

        // 简单的输入校验
        if (name != null && !name.trim().isEmpty() && content != null && !content.trim().isEmpty()) {

            // 3. 封装 Message 对象
            cn.edu.cn.sx.Message newMessage = new cn.edu.cn.sx.Message(name.trim(), content.trim());

            // 4. 获取共享的留言列表并添加新留言
            ServletContext context = this.getServletContext();
            @SuppressWarnings("unchecked")
            List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

            // 留言添加到列表的头部 (索引 0)，实现最新留言在上面
            messageList.add(0, newMessage);
        }

        // 5. 【关键】处理完数据后，重定向到 GET 请求，防止 F5 刷新导致重复提交
        response.sendRedirect("message");
    }

    /**
     * 【核心】处理 HTTP GET 请求：展示所有历史留言和输入表单
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 设置响应编码，确保输出的 HTML 页面正确显示中文
        response.setContentType("text/html;charset=UTF-8");

        // 2. 获取共享的留言列表
        ServletContext context = this.getServletContext();
        @SuppressWarnings("unchecked")
        List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

        // 3. 开始构建 HTML 响应
        response.getWriter().println("<!DOCTYPE html>");
        response.getWriter().println("<html><head><title>在线留言板 - 实验</title>");
        // 提示学生可以在这里链接 style.css
        response.getWriter().println("<link rel='stylesheet' type='text/css' href='style.css'>");
        response.getWriter().println("</head><body>");

        response.getWriter().println("<h1>留言板 (Servlet 实验)</h1>");

        // 4. 【展示表单】学生需在 index.html 中实现此表单，这里为了方便直接嵌入
        response.getWriter().println("<h2>留下您的印记</h2>");
        response.getWriter().println("<form action='message' method='POST'>");
        response.getWriter().println("昵称: <input type='text' name='name' required><br>");
        response.getWriter().println("留言: <textarea name='message' rows='4' cols='50' required></textarea><br>");
        response.getWriter().println("<input type='submit' value='提交留言'>");
        response.getWriter().println("</form>");

        response.getWriter().println("<hr>");

        // 5. 【展示历史留言】
        response.getWriter().println("<h2>历史留言 (" + messageList.size() + " 条)</h2>");
        response.getWriter().println("<table border='1' width='80%'>");
        response.getWriter().println("<tr><th>昵称</th><th>留言内容</th><th>时间</th></tr>");

        // 遍历列表，动态生成表格行
        for (Message msg : messageList) {
            response.getWriter().println("<tr>");
            response.getWriter().println("<td>" + msg.getName() + "</td>");
            response.getWriter().println("<td>" + msg.getContent() + "</td>");
            response.getWriter().println("<td>" + msg.getFormattedTimestamp() + "</td>"); // 使用带时间戳的方法
            response.getWriter().println("</tr>");
        }

        response.getWriter().println("</table>");
        response.getWriter().println("</body></html>");
    }

}